#! /usr/bin/env python
# -*- coding: utf-8 -*-

"""
 *
 * - Generalna sidescrool igra ala Super Mario
 *
 *  - za testiranje postojecih i dodavanje novih mogucnosti enginea
 *
 * Autori: Koki007
 * Verzija: 0.1
 * Datum: 04.01.2011
 *
"""

import pygame
from pygame.locals import *
import os

from DB_engine.engine import cEngine
from DB_engine.stanje import cStanje
from DB_engine.kamera import cKamera
from DB_engine.mapa import cMapa
from DB_engine.objekti import cObjekt, cPokretni_sidescroll_objekt#, cIgrac, cItem, cNeprijatelj
from DB_engine.AI import cOsnovni_AI
from DB_engine.gui import cGUI_upravitelj


# ######################################################################
#
# game_level objekti za sidescroler - sljedeci objekti se vise ne bave fizikom igre nego mehanikom igre
# TODO: premjestiti ovo u sidescroll igru
class cIgrac(cPokretni_sidescroll_objekt):
    
    def __init__(self, engine, ime, x, y, animacija = False):
        cPokretni_sidescroll_objekt.__init__(self, engine, ime, x, y, animacija)
        self.broj_zivota = 5
        self.broj_zvijezdica = 0

        self.zvuk_ozljeda = pygame.mixer.Sound( os.path.join("sidescroller_test","ouch.wav") )
        pass

    def odgovor_na_sudar(self, objekt):
        if isinstance(objekt, cItem):
            print "igrac sudar-> item"
            # uzimanje vrijednosti koje item sadrzi
            ime, vrijednost = objekt.provjeri_vrijednost()
            if ime in self.korisnikove_varijable:
                self.korisnikove_varijable[ime] += vrijednost
            else: self.korisnikove_varijable[ime] = vrijednost
            
            #TEST
            for ime, vrijednost in self.korisnikove_varijable.iteritems():
                print ime, vrijednost

        if isinstance(objekt, cNeprijatelj):

            #for ime, vrijednost in self.interaktivna_lista.iteritems():
                #print ime, vrijednost
    
            self.titraj(300, 2000)
            self.zvuk_ozljeda.play()
            self.cvrst = False
            #self.interaktivan = False
            self.interaktivna_lista[objekt.interaktivna_grupa] = False # to treba vratiti nakon nekog vremena natrag, jel 
            self.task_tajmer.dodaj_task(2000, 0, self.postavi_interaktivnost, objekt.interaktivna_grupa, True)
            pass
        pass


    def azuriraj(self):
        cPokretni_sidescroll_objekt.azuriraj(self)

        # TODO: privremeno - srediti ovo drugcije
        if not self.titra:
            self.cvrst = True
            self.interaktiva = True



class cNeprijatelj(cPokretni_sidescroll_objekt):

    def __init__(self, engine, ime, x, y, animacija = False):
        cPokretni_sidescroll_objekt.__init__(self, engine, ime, x, y, animacija)
        self.korisnikove_varijable["snaga"] = 1
        self.interaktivna_grupa = "neprijatelj"
        pass

    def odgovor_na_sudar(self, objekt):
        if isinstance(objekt, cIgrac):
            print "neprijatelj sudar-> cIgrac"

        pass


class cTile(cObjekt):

    def __init__(self, engine, ime, x, y, animacija = False):
        cObjekt.__init__(self, engine, ime, x, y, animacija)
        self.interaktivna_grupa = "tile"
        pass



# "item" na hrvatskome a da ima smisla? O.o
class cItem(cPokretni_sidescroll_objekt):

    def __init__(self, engine, ime, x, y, animacija = False, colorkey = 0):
        cPokretni_sidescroll_objekt.__init__(self, engine, ime, x, y, animacija, colorkey)
        self.cvrst = False
        self.interaktivna_grupa = "item"
        # TODO - privremeno ovdje
        self.zvuk = pygame.mixer.Sound( os.path.join("sidescroller_test","coin.wav") )

    def azuriraj(self):
        cPokretni_sidescroll_objekt.azuriraj(self)
            

    def odgovor_na_sudar(self, objekt):
        if isinstance(objekt, cIgrac):
            print "Item sudar-> igrac"
            self.interaktivan = False
            self.promjeni_gravitaciju(-0.1)
            self.fade_out(1000)
            self.zvuk.play() # TODO -
        pass

    def postavi_vrijednost(self, ime, vrijednost):
        self.ime_vrijednosti = ime
        self.vrijednost = vrijednost

    def provjeri_vrijednost(self):
        return self.ime_vrijednosti, self.vrijednost



# glavno (i jedino) stanje u igri
class glavno_stanje(cStanje):
    def __init__(self, upravitelj, engine, ime):
        cStanje.__init__(self, upravitelj, engine, ime)

        
        self.mapa = cMapa(engine)
        self.mapa.dodaj_sloj("glavni",  1)

        self.kamera = cKamera(self.engine.provjeri_rezoluciju(), engine.glavni_buffer )
        self.kamera.fokusiraj_na_centar()
        

        # muzika
        pygame.mixer.music.load( os.path.join("sidescroller_test","song03.ogg") )
        pygame.mixer.music.play(-1, 0.0)
        pygame.mixer.music.set_volume(0.1)

        self.loadiraj_pokusni_level()
        print "Inicijalizirano glavno stanje"
        pass
        
        
    def primi_event(self, event):
        if event.type == KEYDOWN:
            if event.key == K_SPACE:
                self.igrac.skoci()
        #GUI_upravitelj.primi_event(event)
        pass

        
    # AZURIRANJE IGRE      
    def azuriraj(self):
        pritsnute_tipke = pygame.key.get_pressed()

        if pritsnute_tipke[K_LEFT]: self.igrac.pomakni_lijevo()
        if pritsnute_tipke[K_RIGHT]: self.igrac.pomakni_desno()


        self.mapa.azuriraj()
        self.kamera.azuriraj() # azurirati poziciju kamere tek nakon sto se azurira mapa
        #GUI_upravitelj.azuriraj()
        pass
        
    # CRTANJE IGRE    
    def crtaj(self):
        self.engine.glavni_buffer.fill((18, 176, 227)) # pozadina je plava
        self.kamera.crtaj_mapu(self.mapa, "glavni",  self.engine.glavni_buffer)
        #GUI_upravitelj.crtaj(glavni_buffer)
        pass

    # LOADIRAJ
    def loadiraj_pokusni_level(self):

        self.igrac = cIgrac( self.engine, os.path.join("sidescroller_test",'toad_animacija.txt') , 700, 50, 1)
        self.mapa.dodaj_objekt("glavni",  self.igrac)
        self.igrac.titraj(250, 3000)

        tile_path = os.path.join("sidescroller_test",'tile_2.png')

        temp = cObjekt( self.engine, os.path.join("sidescroller_test",'tile_2.png') , 200, 200)
        temp1 = cObjekt( self.engine, tile_path, 200, 200)
        temp2 = cObjekt( self.engine, tile_path, 200, 200)
        temp3 = cObjekt( self.engine, tile_path, 1200, 200)
        
        zvijezda1 = cItem( self.engine, os.path.join("sidescroller_test",'zvijezda.png') , 500, 50, False, (255, 255, 255))
        zvijezda2 = cItem( self.engine, os.path.join("sidescroller_test",'zvijezda.png') , 425, 50, False, (255, 255, 255))
        zvijezda3 = cItem( self.engine, os.path.join("sidescroller_test",'zvijezda.png') , 350, 50, False, (255, 255, 255))
        
        zvijezda1.postavi_vrijednost("broj_zvijezdica", 1)
        zvijezda2.postavi_vrijednost("broj_zvijezdica", 1)
        zvijezda3.postavi_vrijednost("broj_zvijezdica", 1)

        mario3 = cPokretni_sidescroll_objekt( self.engine, os.path.join("sidescroller_test",'super_mario.jpg') , 330, 0)
        mario3.fade_out(2000)
        #mario3.postavi_transparentnost(10)
        mario_AI = cNeprijatelj( self.engine, os.path.join("sidescroller_test",'toad_animacija.txt') , 960, -100, 1)
        mario_AI.dodaj_AI( cOsnovni_AI(mario_AI, [500, 900]) )
        #mario_AI.postavi_vidljivost(0)

        mapa = self.mapa
        mapa.dodaj_u_mrezu("glavni",  temp,  5,  5,  32,  32)
        mapa.dodaj_u_mrezu("glavni",  temp1,  6,  6,  32,  32)
        mapa.dodaj_u_mrezu("glavni",  temp2,  7,  7,  32,  32)
        mapa.dodaj_u_mrezu("glavni",  temp3,  40,  6,  32,  32)

        mapa.dodaj_objekt("glavni",  temp)
        mapa.dodaj_objekt("glavni",  mario3)
        mapa.dodaj_objekt("glavni",  mario_AI)
        mapa.dodaj_objekt("glavni",  zvijezda1)
        mapa.dodaj_objekt("glavni",  zvijezda2)
        mapa.dodaj_objekt("glavni",  zvijezda3)

        mapa.dodaj_liniju(cTile, "glavni", tile_path,  7,  40,  7,  32,  32)
        mapa.dodaj_liniju(cTile, "glavni", tile_path,  10,  20,  3,  32,  32)
        mapa.dodaj_liniju(cTile, "glavni", tile_path,  15,  30,  -1,  32,  32)
        mapa.dodaj_liniju(cTile, "glavni", tile_path,  -10,  5,  7,  32,  32)

        self.kamera.fokusiraj_na_objekt(self.igrac)
        pass

# pocetak main-a
engine = cEngine(800, 600, 60)
engine.upravitelj_stanja.dodaj_stanje("glavno", glavno_stanje)
engine.upravitelj_stanja.aktiviraj_stanje("glavno")
engine.pokreni()
